package com.cwy.hzit.handler;

import com.cwy.hzit.excep.BusinessException;
import com.cwy.hzit.excep.NotPermissionException;
import com.cwy.hzit.utils.R;
import com.cwy.hzit.utils.ResponseEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingPathVariableException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
import org.springframework.web.multipart.support.MissingServletRequestPartException;
import org.springframework.web.servlet.NoHandlerFoundException;


@RestControllerAdvice
@Slf4j
public class HzitGlobalExceptionHandler {

	@ExceptionHandler(NotPermissionException.class)
	public R handlerNotPermissionException(NotPermissionException e){
		log.error("出现了异常：{}",e.getMessage());
		return R.error().message(e.getMessage());
	}

	@ExceptionHandler(Exception.class)
	public R handleException(Exception e){
		log.error(e.getMessage(),e);
		return R.error();
	}
	
	@ExceptionHandler(BadSqlGrammarException.class)
	public R handleBadSqlGrammarException(BadSqlGrammarException e){
		log.error(e.getMessage(), e);
		return R.setResult(ResponseEnum.BAD_SQL_GRAMMAR_ERROR);
	}

	
	@ExceptionHandler(DataIntegrityViolationException.class)
	public R handleSqlException(DataIntegrityViolationException e){
		log.error("异常信息：{}",e.getMessage());
		return R.setResult(ResponseEnum.BAD_SQL_AMBIGUOUS);
	}

	
	@ExceptionHandler(BusinessException.class)
	public R handleBusinessException(BusinessException e){
		log.error(e.getMessage(), e);
		return R.error().message(e.getMessage()).code(e.getCode());
	}
	
	
	@ExceptionHandler({
			NoHandlerFoundException.class,
			HttpRequestMethodNotSupportedException.class,
			HttpMediaTypeNotSupportedException.class,
			MissingPathVariableException.class,
			MissingServletRequestParameterException.class,
			TypeMismatchException.class,
			HttpMessageNotReadableException.class,
			HttpMessageNotWritableException.class,
			MethodArgumentNotValidException.class,
			HttpMediaTypeNotAcceptableException.class,
			ServletRequestBindingException.class,
			ConversionNotSupportedException.class,
			MissingServletRequestPartException.class,
			AsyncRequestTimeoutException.class
	})
	public R handleServletException(Exception e) {
		log.error(e.getMessage(), e);
		return R.error().message(ResponseEnum.SERVLET_ERROR.getMessage()).code(ResponseEnum.SERVLET_ERROR.getCode());
	}
}
